package DTO;

import java.io.Serializable;
import java.util.List;



/**
 * 
 * Classe permettant d'encapsuler une requête et ses paramètres pour une transmission sur le réseau.
 * 
 * @author Valentin Brémond
 * 
 * @version 2.0
 *
 */
public class Capsule implements Serializable
{
	/**
	 * Nécessaire pour la sérialisation.
	 * À modifier lors de chaque changement de version.
	 */
	private static final long serialVersionUID = 200L;
	
	/**
	 * Permet de définir si c'est une requête (true) ou une réponse (false).
	 */
	private boolean requete;
	
	/**
	 * Permet de définir la requête.
	 */
	private String methode;
	
	/**
	 * Permet de stocker l'ID de l'objet.
	 */
	private int id;
	
	/**
	 * Permet de stocker un objet {@link AnnonceDTO}.
	 */
	private AnnonceDTO annonce;
	
	/**
	 * Permet de stocker un objet {@link VendeurDTO}.
	 */
	private VendeurDTO vendeur;
	
	/**
	 * Permet de stocker le login.
	 */
	private String login;

	/**
	 * Permet de stocker le mot de passe.
	 */
	private String mdp;
	
	/**
	 * Permet de stocker le nombre de lignes modifiées.
	 */
	private int lignes;
	
	/**
	 * Permet de savoir si la requête a été effectuée (true) ou pas (false).
	 */
	private boolean fait;
	
	/**
	 * Permet de stocker la liste des objets {@link ResumeAnnonceDTO} en retour.
	 */
	private List<ResumeAnnonceDTO> liste_resume_annonces;
	
	
	
	// CONSTRUCTEUR
	
	
	
	/**
	 * Constructeur par défaut.
	 */
	public Capsule()
	{
		super();
	}

	
	
	// METHODES
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va ajouter une annonce.
	 * 
	 * @param annonce L'instance {@link AnnonceDTO} qui sera ajoutée dans la BDD.
	 */
	public void setRequeteAjouterAnnonce(AnnonceDTO annonce)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "ajouterAnnonce";
		this.annonce = annonce;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse d'un ajout d'annonce.
	 * 
	 * @param nbre_lignes_modifiees Le nombre de lignes modifiées dans la BDD.
	 */
	public void setReponseAjouterAnnonce(int nbre_lignes_modifiees)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "ajouterAnnonce";
		this.lignes = nbre_lignes_modifiees;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va modifier une annonce.
	 *  
	 * @param id_annonce L'ID de l'annonce à modifier.
	 * @param annonce L'instance de {@link AnnonceDTO} qui va modifier celle de la BDD.
	 */
	public void setRequeteModifierAnnonce(int id_annonce, AnnonceDTO annonce)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "modifierAnnonce";
		this.id = id_annonce;
		this.annonce = annonce;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse d'une modification d'annonce.
	 *
	 * @param nbre_lignes_modifiees Le nombre de lignes modifiées dans la BDD, sinon -1 si l'annonce n'existe pas ou -2 si le vendeur associé n'existe plus.
	 */
	public void setReponseModifierAnnonce(int nbre_lignes_modifiees)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "modifierAnnonce";
		this.lignes = nbre_lignes_modifiees;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va supprimer une annonce.
	 * 
	 * @param id_annonce L'ID de l'annonce à supprimer.
	 */
	public void setRequeteSupprimerAnnonce(int id_annonce)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "supprimerAnnonce";
		this.id = id_annonce;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse d'une suppression d'annonce.
	 * 
	 * @param fait "true" si la suppression a réussi, "false" sinon.
	 */
	public void setReponseSupprimerAnnonce(boolean fait)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "supprimerAnnonce";
		this.fait = fait;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va recupérer une annonce.
	 * 
	 * @param id_annonce L'ID de l'annonce à récupérer.
	 */
	public void setRequeteRecupererAnnonce(int id_annonce)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "recupererAnnonce";
		this.id = id_annonce;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse d'une récupération d'annonce.
	 * 
	 * @param annonce L'instance de {@link AnnonceDTO} récupérée.
	 */
	public void setReponseRecupererAnnonce(AnnonceDTO annonce)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "recupererAnnonce";
		this.annonce = annonce;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va récupérer toutes les annonces en tant qu'instances de {@link ResumeAnnonceDTO}.
	 */
	public void setRequeteRecupererToutesAnnonces()
	{
		this.clear();
		
		this.requete = true;
		this.methode = "recupererToutesAnnonces";
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la récupération de toutes les annonces.
	 * 
	 * @param liste_annonces Une liste d'instances de {@link ResumeAnnonceDTO}.
	 */
	public void setReponseRecupererToutesAnnonces(List<ResumeAnnonceDTO> liste_annonces)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "recupererToutesAnnonces";
		this.liste_resume_annonces = liste_annonces;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va récupérer toutes les annonces en tant qu'instances de {@link ResumeAnnonceDTO}.
	 * 
	 * @param id_vendeur L'ID du vendeur pour lequel on va récupérer les annonces.
	 */
	public void setRequeteRecupererAnnoncesVendeur(int id_vendeur)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "recupererAnnoncesVendeur";
		this.id = id_vendeur;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la récupération des annonces d'un vendeur.
	 * 
	 * @param liste_annonces Une liste d'instances de {@link ResumeAnnonceDTO}.
	 */
	public void setReponseRecupererAnnoncesVendeur(List<ResumeAnnonceDTO> liste_annonces)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "recupererAnnoncesVendeur";
		this.liste_resume_annonces = liste_annonces;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va ajouter un vendeur.
	 * 
	 * @param vendeur L'instance de {@link VendeurDTO} qui sera ajoutée dans la BDD.
	 */
	public void setRequeteAjouterVendeur(VendeurDTO vendeur)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "ajouterVendeur";
		this.vendeur = vendeur;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse d'un ajout de vendeur.
	 * 
	 * @param nbre_lignes_modifiees Le nombre de lignes modifiées dans la BDD, sinon -1 si le vendeur existe déjà.
	 */
	public void setReponseAjouterVendeur(int nbre_lignes_modifiees)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "ajouterVendeur";
		this.lignes = nbre_lignes_modifiees;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va modifier un vendeur.
	 * 
	 * @param id_vendeur L'ID du vendeur à modifier.
	 * @param vendeur L'instance de {@link VendeurDTO} qui va modifier celle de la BDD.
	 */
	public void setRequeteModifierVendeur(int id_vendeur, VendeurDTO vendeur)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "modifierVendeur";
		this.id = id_vendeur;
		this.vendeur = vendeur;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la modification d'un vendeur.
	 * 
	 * @param nbre_lignes_modifiees Le nombre de lignes modifiées dans la BDD, sinon -1 si le vendeur n'existe pas ou -2 si le nouveau login est déjà utilisé.
	 */
	public void setReponseModifierVendeur(int nbre_lignes_modifiees)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "modifierVendeur";
		this.lignes = nbre_lignes_modifiees;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va supprimer un vendeur.
	 * 
	 * @param id_vendeur L'ID du vendeur à modifier.
	 */
	public void setRequeteSupprimerVendeur(int id_vendeur)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "supprimerVendeur";
		this.id = id_vendeur;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la suppression d'un vendeur.
	 * 
	 * @param fait "true" si le vendeur a été supprimé de la BDD, "false" sinon.
	 */
	public void setReponseSupprimerVendeur(boolean fait)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "supprimerVendeur";
		this.fait = fait;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va récupérer un vendeur.
	 * 
	 * @param id_vendeur L'ID du vendeur à récupérer.
	 */
	public void setRequeteRecupererVendeur(int id_vendeur)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "recupererVendeur";
		this.id = id_vendeur;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la récupération d'un vendeur.
	 * 
	 * @param vendeur Une instance de {@link VendeurDTO}.
	 */
	public void setReponseRecupererVendeur(VendeurDTO vendeur)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "recupererVendeur";
		this.vendeur = vendeur;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va vérifier les données du vendeur pour pouvoir le connecter au serveur.
	 * 
	 * @param login Le login du vendeur.
	 * @param mot_de_passe Le mot de passe du vendeur.
	 */
	public void setRequeteConnexionVendeur(String login, String mot_de_passe)
	{
		this.clear();
		
		this.requete = true;
		this.methode = "connexionVendeur";
		this.login = login;
		this.mdp = mot_de_passe;
	}
	
	/**
	 * Permet de définir le paquet réseau en tant que réponse de la connexion d'un vendeur.
	 * 
	 * @param id_vendeur L'ID du vendeur si la connexion est réussie, -1 sinon.
	 */
	public void setReponseConnexionVendeur(int id_vendeur)
	{
		this.clear();
		
		this.requete = false;
		this.methode = "connexionVendeur";
		this.id = id_vendeur;
	}
	
	
	
	/**
	 * Permet de définir le paquet réseau en tant que requête qui va fermer la connexion au serveur.
	 */
	public void setRequeteFermerConnexion()
	{
		this.clear();
		
		this.requete = true;
		this.methode = "quitter";
	}
	
	
	
	/**
	 * Permet de remettre à zéro une capsule.
	 */
	public void clear()
	{
		this.annonce = null;
		this.fait = false;
		this.id = 0;
		this.lignes = 0;
		this.liste_resume_annonces = null;
		this.login = null;
		this.mdp = null;
		this.methode = null;
		this.requete = false;
		this.vendeur = null;
	}
	
	
	
	// GETTERS
	


	public boolean isRequete()
	{
		return requete;
	}



	public String getMethode()
	{
		return methode;
	}



	public int getId()
	{
		return id;
	}


	
	public AnnonceDTO getAnnonce()
	{
		return annonce;
	}



	public VendeurDTO getVendeur()
	{
		return vendeur;
	}



	public String getLogin()
	{
		return login;
	}


	
	public String getMotDePasse()
	{
		return mdp;
	}



	public int getNombreLignesModifiees()
	{
		return lignes;
	}


	
	public boolean isFait()
	{
		return fait;
	}



	public List<ResumeAnnonceDTO> getListeResumeAnnonces()
	{
		return liste_resume_annonces;
	}
}
